package com.itheima.d5_synchronized_method;

/*
    账户类

    同步方法
        作用：把访问共享资源的核心方法给上锁，以此保证线程安全。

        修饰符 synchronized 返回值类型 方法名称(形参列表) {
        	操作共享资源的代码
        }

        原理：每次只能一个线程进入，执行完毕以后自动解锁，其他线程才可以进来执行。
        同步方法底层原理
        同步方法其实底层也是有隐式锁对象的，只是锁的范围是整个方法代码。
        如果方法是实例方法：同步方法默认用this作为的锁对象。
        如果方法是静态方法：同步方法默认用类名.class作为的锁对象。
 */
public class Account {
    private String cardId; // 卡号
    private double money; // 余额。

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    // 小明 小红同时过来的
    public synchronized void drawMoney(double money) throws InterruptedException {
        String name = Thread.currentThread().getName();
        if (this.money >= money) {
            Thread.sleep(10);
            this.money -= money;
            System.out.println(name + "来取钱" + money + "成功!");
            System.out.println(name + "取钱后,账户剩余" + this.money);
        } else {
            System.out.println(name + "来取钱,余额不足!");
        }
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }


}
